home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
scope
/
151-175
/
scopedisk168
/
clianywhere
/
clianywhere.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-19
|
2KB
|
99 lines
;/*
FailAt 1
LC -M -v -cs -O -iINCLUDE:CompactH/ CLIanywhere.c
Blink CLIanywhere.o ND
Protect CLIanywhere +p
Quit
*/
#include <string.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <libraries/dos.h>
#include <exec/memory.h>
#include <proto/intuition.h>
#include <proto/exec.h>
#include <proto/dos.h>
#define iswhite(c) ((c)==' '||(c)=='\t'||(c)=='\n')
int __asm CLIanywhere(register __a0 char *args, register __d0 int argl)
{
ULONG ilock;
struct Screen *s;
USHORT flags;
BPTR file, nullfh;
char *cmd, *c;
ULONG size = 0L; /* this flags whether to FreeMem(cmd) or not */
struct DosLibrary *DOSBase;
struct IntuitionBase *IntuitionBase;
DOSBase = (struct DosLibrary *)OpenLibrary("dos.library",33);
if (!DOSBase) return(100);
IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",33);
if (!IntuitionBase) return(100);
/*
** process the command line args
*/
/* NULL-delimit args */
c = (args + argl);
*c = '\0';
/* trunc trailing newline */
for(c--; (c > args) && iswhite(*c); c--) *c = '\0';
/* skip leading white space */
while(iswhite(*args)) args++;
if (*args)
{
cmd = args;
}
else
{
file = Open("s:CLIanywhere.cmd",MODE_OLDFILE);
if (!file)
{
cmd = "c:NewShell \"NEWCON:0/11/640/50/ CLIanywhereShell \"";
}
else
{
Seek(file,0L,OFFSET_END);
size = Seek(file,0L,OFFSET_CURRENT);
size++;
cmd = AllocMem(size,MEMF_PUBLIC);
if (!cmd)
{
Close(file);
return(100);
}
Seek(file,0L,OFFSET_BEGINNING);
Read(file,(UBYTE *)cmd,size);
Close(file);
*(char *)(cmd + size - 1) = '\0';
}
}
ilock = LockIBase(0L);
s = IntuitionBase->FirstScreen;
flags = s->Flags;
s->Flags = ( (s->Flags & (~SCREENTYPE)) | WBENCHSCREEN);
UnlockIBase(ilock);
nullfh = Open("NIL:",MODE_NEWFILE);
if (nullfh)
{
Execute(cmd,nullfh,nullfh);
Close(nullfh);
}
ilock = LockIBase(0L);
if (s == IntuitionBase->FirstScreen) s->Flags = flags;
UnlockIBase(ilock);
if (size > 0L) FreeMem(cmd,size);
CloseLibrary((struct Library *)IntuitionBase);
CloseLibrary((struct Library *)DOSBase);
return(0);
}